/**
 * Project Name:dyrj-admin
 * File Name:Swagger2.java
 * Package Name:com.dyrj.component
 * Date:2017年10月16日下午6:43:07
 * Copyright (c) 2017, zhang.xiangyu@foxmail.com All Rights Reserved.
*/
package com.dyrj.component;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import springfox.documentation.builders.*;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Parameter;
import springfox.documentation.service.ResponseMessage;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @Title: Swagger2.java
 * @Package com.dyrj.component
 * @Description: TODO(Swagger2配置)
 * @author
 * @date 2017年10月16日 下午6:43:07
 * @version V1.0
 */
@Configuration
@EnableSwagger2
public class Swagger2 {
	
	/**
	 * @Title: createRestApi 
	 * @Description: TODO(文档@ApiOperation注解来给API增加说明、
	 * 		通过@ApiImplicitParams、@ApiImplicitParam注解来给参数增加说明。) 
	 * @return Docket    返回类型
	 */
	@Bean
	public Docket createRestApi() {
//		return new Docket(DocumentationType.SWAGGER_2)
//				.apiInfo(apiInfo())
//				.select()
//				.apis(RequestHandlerSelectors.basePackage("com.dyrj.api"))
//				.paths(PathSelectors.any())
//				.build()
//				.globalOperationParameters(this.setHeaderToken())
//				.useDefaultResponseMessages(false)
//				.globalResponseMessage(RequestMethod.POST, this.setResponseMessage())
//				.globalResponseMessage(RequestMethod.GET,this.setResponseMessage());

        Docket docket = new Docket(DocumentationType.SWAGGER_2);
        docket.enable(true);
        //apiInfo()用来创建该Api的基本信息（这些基本信息会展现在文档页面中）。
        //select()函数返回一个ApiSelectorBuilder实例用来控制哪些接口暴露给Swagger来展现，本例采用指定扫描的包路径来定义，Swagger会扫描该包下所有Controller定义的API，并产生文档内容（除了被@ApiIgnore指定的请求）。
        docket.apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.dyrj.api"))
                .paths(PathSelectors.any()).build();
        return docket;
	}

	/**
	 * @Title: apiInfo 
	 * @Description: TODO(版本信息备注) 
	 * @return
	 * @return ApiInfo    返回类型
	 */
//	private ApiInfo apiInfo() {
//		return new ApiInfoBuilder()
//				.title("Meatball APIS")
//				//.description("更多Spring Boot相关文章请关注：https://my.oschina.net/qjedu")
//				.termsOfServiceUrl("http://xxx.xxx.com/")
//				//.contact(new Contact("", "https://my.oschina.net/qjedu", "zhang.xiangyu@foxmail.com"))
//				.license("Apache 2.0")
//				.licenseUrl("http://www.apache.org/licenses/LICENSE-2.0.html")
//				.version("1.0").build();
//	}

    private ApiInfo apiInfo() {
//        return new ApiInfoBuilder().title("springboot利用swagger构建api文档").description("在这里你可以浏览项目所有接口，并提供相关测试工具")
//                .termsOfServiceUrl("http://localhost:8080").contact("test")
//                .license("China Red Star Licence Version 1.0").licenseUrl("#").version("1.0").build();
        return new ApiInfoBuilder().title("有奖答题平台 APIS").description("")
                .version("1.0").build();

        //swaggerOptions.validationUrl

    }

	/**
	 * @Title: apiInfo
	 * @Description: TODO(添加自定义返回code)
	 * @return ApiInfo    返回类型
	 */
	private List<ResponseMessage> setResponseMessage() {
		return new ArrayList<>(Arrays.asList(new ResponseMessageBuilder()
				.code(404)
				.message("找不到请求页面")
				.responseModel(new ModelRef("错误"))
				.build()));
	}

	/**
	 * @Title: apiInfo
	 * @Description: TODO(添加自定义参数)
	 * @return ApiInfo    返回类型
	 */
	private List<Parameter> setHeaderToken() {
		ParameterBuilder tokenPar = new ParameterBuilder();
		List<Parameter> pars = new ArrayList<>();
		tokenPar.name("access_token")
				.description("认证令牌")
				.modelRef(new ModelRef("string"))
				.parameterType("header")
				.required(false)
				.build();
		pars.add(tokenPar.build());
		return pars;
	}
 }
